package com.example.config;

import io.github.briqt.spark4j.SparkClient;
import io.github.briqt.spark4j.constant.SparkApiVersion;
import io.github.briqt.spark4j.model.SparkMessage;
import io.github.briqt.spark4j.model.SparkSyncChatResponse;
import io.github.briqt.spark4j.model.request.SparkRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;

@Component
@Slf4j
public class SparkManager {
    @Resource
    private SparkClient sparkClient;

    /**
     * AI生成问题的预设条件
     */
    public static final String PRECONDITION_question_choice = "你是一个题目生成者，接下来我会按照以下固定格式给你提供内容：\n" +
            "知识点范围：\n" +
            "{生成题目的知识点范围}\n" +
            "题目类型：\n" +
            "{生成题目的题目类型}\n" +
            "题目数量：\n" +
            "{生成题目的数量}\n" +
            "学科:\n"+
            "{指定生成题目所属的科目}"+
            "请根据这三部分内容，按照以下指定格式生成不同的内容,question里面一定要有选项（此外不要输出任何多余的开头、结尾、注释、换行,不能使用Latex格式的数学公式）\n" +
            "question:大圆与小圆的半径比为5:4，那么小圆与大圆的面积比是? A.25:16 B.4:5 C.16:25 D.1:3\n" +
            "question_type:选择题\n" +
            "answer:C\n"+
            "最终格式是：question: \nquestion_type: \nanswer: ";
    public static final String PRECONDITION_question = "你是一个题目生成者，接下来我会按照以下固定格式给你提供内容：\n" +
            "知识点范围：\n" +
            "{生成题目的知识点范围}\n" +
            "题目类型：\n" +
            "{生成题目的题目类型}\n" +
            "题目数量：\n" +
            "{生成题目的数量}\n" +
            "学科:\n"+
            "{指定生成题目所属的科目}"+
            "请根据这三部分内容，按照以下指定格式生成不同的内容（此外不要输出任何多余的开头、结尾、注释、换行）\n" +
            "question:1+1=？  \n" +
            "question_type:填空题\n" +
            "answer:2\n"+
            "最终格式是：question: \nquestion_type: \nanswer: ";

    public static final String PRECONDITION_answer = "你是一个试卷批改者，你需要判断用户答案是否是这个问题的正确答案，接下来我会按照以下固定格式给你提供内容：\n" +
            "QNum：5\n" +
            "Question：在复变函数中，柯西-黎曼方程是用来描述什么的？ A.解析函数的性质 B.实部和虚部的关系 C.导数的存在性 D.函数的连续性"+
            "Answer：A.解析函数的性质\n" +
            "UAnswer：A\n" +
            "QNum：7\n" +
            "Question：在直角坐标系中，直线y=2x+3与x轴的交点坐标是？ A. (-1.5,0) B. (0,3) C. (-3/2,0) D. (0,-3)\n" +
            "Answer：C\n" +
            "UAnswer：B\n" +
            "QNum：10\n" +
            "Question：小明有5个苹果，他送给小红2个，还剩几个苹果？\n" +
            "Answer：7个\n" +
            "UAnswer：7个\n" +
            "QNum：18\n" +
            "Question：1+1=？ A.1 B.2 C.3 D.4 \n" +
            "Answer：B\n" +
            "UAnswer：A\n" +
            "请根据Question和Answer，判断用户给出的答案(UAnswer)对不对，不对的话输出false，对的话输出true，按照以下指定格式生成输出,只需要传出QNum和Correct的对应内容（此外不要输出任何多余的开头、结尾、注释、换行!）\n" +
            "QNum: 5\n" +
//            "Question：在复变函数中，柯西-黎曼方程是用来描述什么的？ A.解析函数的性质 B.实部和虚部的关系 C.导数的存在性 D.函数的连续性"+
//            "Answer：A.解析函数的性质\n" +
            "UAnswer：A\n" +
            "Correct: true\n" +
            "QNum: 7\n" +
//            "Question：在直角坐标系中，直线y=2x+3与x轴的交点坐标是？ A. (-1.5,0) B. (0,3) C. (-3/2,0) D. (0,-3)\n" +
//            "Answer：C\n" +
            "UAnswer：B\n" +
            "Correct: false\n" +
            "QNum: 10\n" +
            "UAnswer：7个\n" +
            "Correct: true\n" +
            "QNum: 18\n" +
            "UAnswer：A\n" +
            "Correct: false\n" +
            "最终格式是：Qnum: \nUAnswer: \nCorrect: \n";

    public static final String PRECONDITION_analysis = "你是一个知识点分析者，接下来我会按照以下固定格式给你提供内容：\n" +
            "知识点: 复变函数与积分变换\n" +
            "错误数量: 0\n" +
            "正确数量: 3\n"+
            "知识点: 十以内加减法\n"+
            "错误数量: 6\n"+
            "正确数量: 0\n"+
            "请根据意思内容，分析用户的学习情况，按照以下指定格式生成至少100字的输出（此外不要输出任何多余的开头、结尾、注释、换行）\n" +
            "知识点掌握情况分析：\n" +
            "在复变函数与积分变换方面，学生表现出色，错误数量为0，正确数量达到3。这表明学生在这一领域的理解和应用能力较强，能够准确掌握相关概念和解题方法。\n" +
            "然而，在十以内加减法的知识点上，学生遇到了一些困难，错误数量高达6，正确数量为0。这可能意味着学生在基础算术技能上存在不足，需要额外的练习和指导来加强这一部分的知识。\n" +
            "建议针对十以内加减法进行重点复习和练习，同时保持对复变函数与积分变换知识的巩固。通过增加练习量、探索不同的解题技巧和寻求教师的帮助，学生可以提高在基础算术上的熟练度，从而全面提升数学能力。" +
            "最终格式是：知识点掌握分析: \n";

    public static final String PRECONDITION_content = "你是一个问题解答机器人，接下来我会按照以下固定格式给你提供内容：\n" +
            "问题: 为什么5*4=20\n" +
            "问题: 1+1=几？\n" +
            "问题: 2+2=几？\n" +
            "请根据问答提供给我解答（此外不要输出任何多余的开头、结尾、注释、换行和中括号）\n" +
            "回答:我们可以把5*4看成4个5相加，这样子就可以得出4*5=20\n" +
            "回答:1+1=2\n" +
            "回答:2+2=4\n" +
            "最终格式是：回答: \n";


    /**
     * 向星火AI发送请求
     *
     * @param content
     * @return
     */
    //生成选择题
    public String sendMesToAIUseXingHuo_question_choice(final String content) {
        // 消息列表，可以在此列表添加历史对话记录
        List<SparkMessage> messages = new ArrayList<>();
        messages.add(SparkMessage.systemContent(PRECONDITION_question_choice));
        messages.add(SparkMessage.userContent(content));
        // 构造请求
        SparkRequest sparkRequest = SparkRequest.builder()
                // 消息列表
                .messages(messages)
                // 模型回答的tokens的最大长度，非必传，默认为2048
                .maxTokens(2048)
                // 结果随机性，取值越高随机性越强，即相同的问题得到的不同答案的可能性越高，非必传，取值为[0,1]，默认为0.5
                .temperature(0.5)
                // 指定请求版本
                .apiVersion(SparkApiVersion.V1_5)
                .build();
        // 同步调用
        SparkSyncChatResponse chatResponse = sparkClient.chatSync(sparkRequest);
        String responseContent = chatResponse.getContent();
//        log.info("星火AI返回的结果{}", responseContent);
        return responseContent;
    }
    //生成选择题和填空题
    public String sendMesToAIUseXingHuo_question(String content) {
        // 消息列表，可以在此列表添加历史对话记录
        List<SparkMessage> messages = new ArrayList<>();
        messages.add(SparkMessage.systemContent(PRECONDITION_question));
        messages.add(SparkMessage.userContent(content));
        // 构造请求
        SparkRequest sparkRequest = SparkRequest.builder()
                // 消息列表
                .messages(messages)
                // 模型回答的tokens的最大长度，非必传，默认为2048
                .maxTokens(4096)
                // 结果随机性，取值越高随机性越强，即相同的问题得到的不同答案的可能性越高，非必传，取值为[0,1]，默认为0.5
                .temperature(0.5)
                // 指定请求版本
                .apiVersion(SparkApiVersion.V1_5)
                .build();
        // 同步调用
        SparkSyncChatResponse chatResponse = sparkClient.chatSync(sparkRequest);
        String responseContent = chatResponse.getContent();
//        log.info("星火AI返回的结果{}", responseContent);
        return responseContent;
    }
    //判断题目对错
    public String sendMesToAIUseXingHuo_correct_question(String content) {
        List<SparkMessage> messages = new ArrayList<>();
        messages.add(SparkMessage.systemContent(PRECONDITION_answer));
        messages.add(SparkMessage.userContent(content));
        // 构造请求
        SparkRequest sparkRequest = SparkRequest.builder()
                // 消息列表
                .messages(messages)
                // 模型回答的tokens的最大长度，非必传，默认为2048
                .maxTokens(2048)
                // 结果随机性，取值越高随机性越强，即相同的问题得到的不同答案的可能性越高，非必传，取值为[0,1]，默认为0.5
                .temperature(0.9)
                // 指定请求版本
                .apiVersion(SparkApiVersion.V1_5)
                .build();
        // 同步调用
        SparkSyncChatResponse chatResponse = sparkClient.chatSync(sparkRequest);
        String responseContent = chatResponse.getContent();
//        log.info("星火AI返回的结果{}", responseContent);
        return responseContent;
    }
    //生成学科分析
    public String sendMesToAIUseXingHuo_create_analysis(String content) {
        List<SparkMessage> messages = new ArrayList<>();
        messages.add(SparkMessage.systemContent(PRECONDITION_analysis));
        messages.add(SparkMessage.userContent(content));
        // 构造请求
        SparkRequest sparkRequest = SparkRequest.builder()
                // 消息列表
                .messages(messages)
                // 模型回答的tokens的最大长度，非必传，默认为2048
                .maxTokens(2048)
                // 结果随机性，取值越高随机性越强，即相同的问题得到的不同答案的可能性越高，非必传，取值为[0,1]，默认为0.5
                .temperature(0.9)
                // 指定请求版本
                .apiVersion(SparkApiVersion.V4_0)
                .build();
        // 同步调用
        SparkSyncChatResponse chatResponse = sparkClient.chatSync(sparkRequest);
        String responseContent = chatResponse.getContent();
//        log.info("星火AI返回的结果{}", responseContent);
        return responseContent;
    }

    public String sendMesToAIUseXingHuo_create_content(String content) {
        List<SparkMessage> messages = new ArrayList<>();
        messages.add(SparkMessage.systemContent(PRECONDITION_content));
        messages.add(SparkMessage.userContent(content));
        // 构造请求
        SparkRequest sparkRequest = SparkRequest.builder()
                // 消息列表
                .messages(messages)
                // 模型回答的tokens的最大长度，非必传，默认为2048
                .maxTokens(2048)
                // 结果随机性，取值越高随机性越强，即相同的问题得到的不同答案的可能性越高，非必传，取值为[0,1]，默认为0.5
                .temperature(0.9)
                // 指定请求版本
                .apiVersion(SparkApiVersion.V4_0)
                .build();
        // 同步调用
        SparkSyncChatResponse chatResponse = sparkClient.chatSync(sparkRequest);
        String responseContent = chatResponse.getContent();
//        log.info("星火AI返回的结果{}", responseContent);
        return responseContent;
    }
}
